/* Copyright (c) [2020] [ylc]. Licensed under Apache-2.0 License. */

#include "my_uart.h"

mUart_t mUart={0};

/********************************   硬件接口   **********************************/

//串口初始化
void uart_init(void)
{
	
}

//将数据写入发送寄存器
void uart_send_byte(u8 value)
{
	value;
}

//获取串口标志位
u8 uart_get_flag(u8 flag)
{
	u8 stat=0;
	switch(flag){
		case UART_FLAG_TC:{			//发送完成标志
			stat=0;
		}break;
		default:{
		}break;
	}
	return stat;
}

//清除标志位
void uart_clear_flag(u8 flag)
{
	switch(flag){
		case UART_FLAG_TC:{			//
			
		}break;
		default:{
		}break;
	}
}

/********************************   收发逻辑   **********************************/

//串口阻塞发送
void uart_send(u8 *buf,u16 len)			
{
	while(len--){
		uart_send_byte(*buf++);                  //数据填入发送寄存器
		while(uart_get_flag(UART_FLAG_TC)==0);  //等待发送完成标志
        uart_clear_flag(UART_FLAG_TC);          //如果标志不是硬件清除，则需要手动清除
	}
}
/*	
//防卡死版本，超时时间要根据芯片主频和波特率设置，直接问deepseek
void uart_send(u8 *buf,u16 len)			
{
	u8 count;
	while(len--){
		uart_send_byte(*buf++);                  //数据填入发送寄存器
		count=208;
		while(uart_get_flag(UART_FLAG_TC)==0&&--count);  //等待发送完成标志
        uart_clear_flag(UART_FLAG_TC);          //如果标志不是硬件清除，则需要手动清除
	}
}
*/

//串口中断发送，不应该与阻塞发送混用
u8 uart_send_it(u8 *buf,u16 len)	
{
    if(mUart.flags.txstart)  return 1; 	//正在发送，返回忙碌
    if(len==0)  return 0; 
    mUart.flags.txstart=1;
    mUart.ptxbuf=buf;
    mUart.txlen=len;
    mUart.txindex=1;
    uart_send_byte(*buf);				//将数据填入发送寄存器
    return 0;
}

//非队列串口
//串口节拍，1ms定时器中断内调用
void uart_timing_1ms(void)
{
	if(mUart.flags.rxstart){
		mUart.rxotime++;
		if(mUart.rxotime>=UART_RXOTIME_MS){
			mUart.rxotime=0;
			mUart.flags.rxstart=0;
			mUart.flags.rxstop=1;
		}
	}
}

//串口接收中断内调用
void uart_get_rx_data_it(u8 value)
{
	mUart.rxotime=0;
	if(mUart.flags.rxstop==0){
        if(mUart.flags.rxstart==0){
            mUart.flags.rxstart=1;
            mUart.rxlen=0;
        }
		mUart.rxbuf[mUart.rxlen++]=value;
		if(mUart.rxlen>=UART_RX_DATALEN-1)mUart.rxlen=UART_RX_DATALEN-1;
	}
}

//串口发送中断内调用
void uart_set_tx_data_it(void)
{
	if(mUart.flags.txstart){
        if(mUart.txindex>=mUart.txlen){
            mUart.flags.txstart=0;
        }
        else{
            uart_send_byte(mUart.ptxbuf[mUart.txindex++]);	//将数据填入发送寄存器
        }
    }
}

//数据包接收处理，在这里做协议解析
void uart_rxproc(u8 *buf,u16 len)
{

}

//放主循环
void Task_uart(void)
{
	if(mUart.flags.rxstop){
		uart_rxproc((u8*)mUart.rxbuf,mUart.rxlen);
		mUart.flags.rxstop=0;
	}
}
